/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package centralehotel.metier.backoffice;

import centralehotel.dao.VilleDAO;
import centralehotel.dao.interfaces.FicheHotelDAOLocal;
import centralehotel.dao.interfaces.PeriodeTarifDAOLocal;
import centralehotel.dao.interfaces.TypeChambreDAOLocal;
import centralehotel.dao.interfaces.VilleDAOLocal;
import centralehotel.exception.ObjetNonTrouveException;
import centralehotel.modele.Chambre;
import centralehotel.modele.FicheHotel;
import centralehotel.modele.GestionnaireHotel;
import centralehotel.modele.PeriodeTarif;
import centralehotel.modele.Reservation;
import java.util.AbstractList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author noel
 */
@Stateless
public class InscriptionHotelMetier implements InscriptionHotelMetierLocal
{
    @EJB
    private VilleDAOLocal villeDAO;

    @EJB
    private ChambreMetierLocal typeChambreMetierBean;
    @EJB
    private PeriodeTarifDAOLocal periodeTarifDAO;
    @EJB
    private FicheHotelDAOLocal ficheHotelDAO;

    /**
     * Sauvegarde un hotel 
     * @param h l'hotel à sauver
     */
    public void SaveHotel(FicheHotel h)
    {
        // attache l'objet ville au persistence contexte (pour pouvoir persister l'hotel avec)
        // si ce n'est pas une nouvelle ville
        if(h.getVille().getIdVille()!=null){            
            h.setVille(villeDAO.find(h.getVille().getIdVille()));
        }
        
        // Mode modification
        if (h.getIdFicheHotel() != null) {
            
            ficheHotelDAO.edit(h);
        } else {
            // Rattachement des periode de tarif à l'hotel
            for (PeriodeTarif p : h.getPeriodeTarifCollection()) {
                p.setFicheHotel(h);
            }
            List<Chambre> listeChambres = new LinkedList<Chambre>();
            int nbChambres = 1;

            // Rattachement des chambres à l'hotel
            for (int i = 0; i < h.getNbChambreSimple(); i++) {
                try {
                    Chambre c = new Chambre();
                    c.setTypeChambre(typeChambreMetierBean.getTypeChambreByName("simple"));
                    c.setFicheHotel(h);
                    c.setNom("Chambre " + nbChambres);
                    listeChambres.add(c);
                    nbChambres++;
                } catch (ObjetNonTrouveException ex) {
                    Logger.getLogger(InscriptionHotelMetier.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

            for (int i = 0; i < h.getNbChambreDouble(); i++) {
                try {
                    Chambre c = new Chambre();
                    c.setTypeChambre(typeChambreMetierBean.getTypeChambreByName("double"));
                    c.setFicheHotel(h);
                    c.setNom("Chambre " + nbChambres);
                    listeChambres.add(c);
                    nbChambres++;
                } catch (ObjetNonTrouveException ex) {
                    Logger.getLogger(InscriptionHotelMetier.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

            for (int i = 0; i < h.getNbSuite(); i++) {
                try {
                    Chambre c = new Chambre();
                    c.setTypeChambre(typeChambreMetierBean.getTypeChambreByName("suite"));
                    c.setFicheHotel(h);
                    c.setNom("Chambre " + nbChambres);
                    listeChambres.add(c);
                    nbChambres++;
                } catch (ObjetNonTrouveException ex) {
                    Logger.getLogger(InscriptionHotelMetier.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

            h.setChambreCollection(listeChambres);

            // Sauvegarde de l'hotel
            ficheHotelDAO.create(h);
        }
    }
    
    /**
     * Récupère les réservation d'un hotel 
     * @param h l'hotel
     * @return la liste des réservations
     */
    public List<Reservation> getReservationByHotel(FicheHotel h)
    {
        List<Reservation> listeReservations = new LinkedList<Reservation>();
        for (Chambre c : h.getChambreCollection()) {
            for (Reservation r : c.getReservationCollection()) {
                listeReservations.add(r);
            }
        }
        return listeReservations;
    }

    /**
     * Supprime un hotel
     * @param h l'hotel à supprimer
     * @throws centralehotel.exception.ObjetNonTrouveException
     */
    public void SupprimerHotel(FicheHotel h) throws ObjetNonTrouveException
    {
        ficheHotelDAO.remove(h);
    }

    /**
     * Récupète la liste des hotels d'un gestionnaire
     * @param g le gestionnaire
     * @return la liste d'hotels 
     */
    public Collection<FicheHotel> getHotelsByGestionnaire(GestionnaireHotel g)
    {
        return ficheHotelDAO.findHotelByGestionnaire(g);
    }
}
